package com.fhzn.auth.enums;


import com.fhzn.auth.constant.Constants;
import lombok.Getter;

/**
 * @author fhzn
 */
@Getter
public enum RedisCacheKeyEnum {

    /**
     * 用户权限数据缓存, /auth-service/auth/下接口相关
     * ${0} 为 handler，即用户nickname，花名拼音
     * ${1} 为 invokeAppName， 即appCode， 调用系统
     */
    USER_AUTH_DATA("wups_user_auth_simple_${0}_${1}", Constants.DEFAULT_REDIS_EXPIRE),


    /**
     * 用户数据资源权限缓存, /auth-service/data-resource下接口相关
     * ${0} 为 handler，即用户nickname，花名拼音
     * ${1} 为 invokeAppName， 即appCode， 调用系统
     * ${3} 为 resourceType，数据资源类型
     */
    USER_DATA_RESOURCE("wups_user_data_res_${0}_${1}_${2}", Constants.SHORT_REDIS_EXPIRE),


    /**
     * 与数据权限资源相关联用户 /auth-service/data-resource下接口相关，用于数据资源相关的变动时清除用户缓存
     * ${0} 为资源id
     */
    DATA_RES_RELATED_USER("wups_data_res_user_${0}", Constants.DEFAULT_REDIS_EXPIRE),

    /**
     * 与资源相关联用户 /auth-service/auth下接口相关，用于资源相关的变动时清除用户缓存
     * ${0} 为资源id
     */
    RES_RELATED_USER("wups_res_user_${0}", Constants.DEFAULT_REDIS_EXPIRE),

    /**
     * 与角色相关联用户 /auth-service/auth下接口相关，用于角色相关的变动时清除用户缓存
     * ${0} 为角色id
     */
    ROLE_RELATED_USER("wups_role_user_${0}", Constants.DEFAULT_REDIS_EXPIRE),

    /**
     * 岗位缓存
     */
    ALL_STATION_REDIS_KEY("wups_station_all", Constants.LONG_REDIS_EXPIRE),

    /**
     * 应用系统缓存
     */
    ALL_APP_REDIS_KEY("wups_app_all", Constants.LONG_REDIS_EXPIRE),

    /**
     * 机构缓存
     */
    ALL_ORG_REDIS_KEY("wups_organization_all", Constants.LONG_REDIS_EXPIRE),

    /**
     * 应用系统关联机构，与应用系统code(appCode)相关
     * ${appCode}
     */
    APP_ORG_REDIS_KEY_PREFIX("wups_organization_by_app_${0}", Constants.LONG_REDIS_EXPIRE),
    EMPTY(null, null);

    private final String expression;
    private final Integer expireInSecond;

    RedisCacheKeyEnum(String expression, Integer expireInSecond) {
        this.expression = expression;
        this.expireInSecond = expireInSecond;
    }

    public String getKey(Object... args) {

        String expression = this.expression;
        int argLength = args.length;

        for (int i = 0; i < argLength; i++) {
            expression = expression.replace("${" + i + "}", String.valueOf(args[i]));
        }

        // key 表达式配置错误或参数传送错误, 一般运行时不会出现这种情况
        if (expression.contains("$")) {
            return null;
        }

        return expression;
    }
}
